// 创建 WxRequest 
// 通过类的方式进行封装，会让代码更加具有复用性
// 也可以方便添加新的属性和方法
class  WxRequest{

    // 定义实例属性，用来设置默认请求参数
    defaults={
        baseURL:'',//请求基准地址
        url:'',//接口的请求路径
        data:null,//请求参数
        method:'GET',//默认的请求方法
        // 用来设置请求头
        header:{
            "Content-type":"application/json"//用来设置数据的交互格式
        },
        timeout:60000//默认的超时时长，小程序默认的超时时长是一分钟
    }


    // 用于创建和初始化类的属性和方法
    // 在实例化时传入的参数，会被 constructor 形参进行接收
    constructor(params={}){
        // 通过 Object.assign 方法合并请求参数
        // 注意：需要传入的参数覆盖默认的参数，因此传入的参数需要放到最后
       this.defaults = Object.assign({},this.defaults,params)
    }
    // request 实例方法接收一个对象类型的参数
    // 属性值和 wx.request 方法调用时传递的参数保持一致
    request(options){

        // 注意：需要先合并完整的请求地址（baseURL+url）
        // https://gmall-prod.atguigu.cn/mall-api + /index/findBanner
        options.url=this.defaults.baseURL+options.url

        // 合并请求参数
        options={
            ...this.defaults,...options
        }

        // 需要使用 Promise 封装 wx.request,处理异步请求
        return new Promise((resolve,reject)=>{
            wx.request({
              ...options,
            //  当接口调用成功时会触发 success 回调函数 
              success:(res)=>{
                resolve(res)
              },
            // 当接口调用失败时，会触发 fail 回调函数
              fail:(err)=>{
                reject(err)
              }

            })
        })
    }

    // 封装 GET 实例方法
    get(url,data={},config={}){
        // 需要调用 request 请求方法发送请求，只需要组织好参数，传递给 request 请求方法即可
        // 当调用get方法时，需要将request方法的返回值 return 出去
        return this.request(Object.assign({url,data,method:'GET'},config))
    }

    // 封装 DETLTE 实例方法
    delete(url,data={},config={}){
        // 需要调用 request 请求方法发送请求，只需要组织好参数，传递给 request 请求方法即可
        return this.request(Object.assign({url,data,method:'DELETE'},config))
    }

    // 封装 POST 实例方法
    post(url,data={},config={}){
        // 需要调用 request 请求方法发送请求，只需要组织好参数，传递给 request 请求方法即可
        return this.request(Object.assign({url,data,method:'POST'},config))
    }
    // 封装 PUT 实例方法
    put(url,data={},config={}){
        // 需要调用 request 请求方法发送请求，只需要组织好参数，传递给 request 请求方法即可
        return this.request(Object.assign({url,data,method:'PUT'},config))
    }
}

// ---------一下是实例化的代码------------
// 目前写到同一个文件中，是为了方便进行测试，以后会提取成多个文件

// 对 WxRequest 进行实例化
const instance = new WxRequest({
    baseURL:'https://gmall-prod.atguigu.cn/mall-api',
    timeout:15000
})

// 将 WxRequest 实例进行暴露出去，方便在其他文件中进行使用
export default instance